package mc.dao;

import java.util.ArrayList;
import java.util.List;
import org.hibernate.FetchMode;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import mc.domain.Pacjent;


public class PacjentManagerDAOHb extends HibernateDaoSupport implements IPacjentManagerDAO {

	public void savePacjent(Pacjent p) {
		getHibernateTemplate().saveOrUpdate(p);
	}

	/**
	 * Metoda pobierajaca samego pacjenta bez kolekcji.Zwraca <code>List</code> pacjentow
	 */
	public Pacjent getPacjentById(int id) {
		
		return (Pacjent) getHibernateTemplate().get(Pacjent.class, new Integer(id));
	}

	public void deletePacjent(Pacjent p) {
		getHibernateTemplate().delete(p);
		
	}

		
	/**
	 * Wyszukuje Pacjentow przez przyklad uwzglegniajac kolekcje adresow
	 * @return List<Pacjent>
	 */	
	public List<Pacjent> getPacjentByExample(Pacjent p) {
		
		if (p.getAdresy().get(0).getUlica()==null && p.getAdresy().get(0).getKodpocztowy()==null
			 && p.getAdresy().get(0).getMiejscowosc()==null){
			
			Example examplePacjent = Example.create(p).ignoreCase().enableLike(MatchMode.START).excludeZeroes();
			DetachedCriteria crit = DetachedCriteria.forClass(Pacjent.class).add(examplePacjent);
			
			return (ArrayList<Pacjent>)getHibernateTemplate().findByCriteria(crit);	
		}
	
		else{
		Example examplePacjent = Example.create(p).ignoreCase().enableLike(MatchMode.START).excludeZeroes();
		
		Example exampleAdres = Example.create(p.getAdresy().iterator().next()).ignoreCase()
							   .enableLike(MatchMode.START).excludeZeroes();
		
		DetachedCriteria crit = DetachedCriteria.forClass(Pacjent.class).add(examplePacjent)
								.createCriteria("adresy").add(exampleAdres);
		
		return (ArrayList<Pacjent>)getHibernateTemplate().findByCriteria(crit);

		}		
		
	}

	/**
	 * @author nickname
	 * Metoda pobierajaca pacjenta ze wszystkimi kolekcjami.
	 * @return Pacjent
	 */
	public Pacjent getFullPacjentById(int id) {
		
		ArrayList l =(ArrayList) getHibernateTemplate()
					.findByCriteria(DetachedCriteria.forClass(Pacjent.class).add(Expression.eq("id", id))
							.setFetchMode("adresy", FetchMode.JOIN));
						//	.setFetchMode("rozpoznania", FetchMode.JOIN)
						//	.setFetchMode("swiadczenia", FetchMode.JOIN));
			
		
			return l.isEmpty() ? null : (Pacjent)l.get(0) ;
	}

	/**
	 * Metoda wyszukujaca ostatnio dodanych do bazy pacjentow
	 * @param ilosc -ilosc pacjentow do wyswietlenia
	 */
	public List<Pacjent> getLatestPacjent(int ilosc) {
		
		return (ArrayList<Pacjent>)getHibernateTemplate().findByCriteria(DetachedCriteria.forClass(Pacjent.class).addOrder(Order.desc("id")),0,ilosc);
	}
	
	
	/**
	 * Metoda pobierajaca z bazy pacjenta z kolekcjami adresow po przykladzie
	 * @param p przyklad pacjenta do pobrania
	 * @return Pacjent
	 */
	public Pacjent getPacjentWithAddressesByExample(Pacjent p) {
		
		Example examplePacjent = Example.create(p).ignoreCase().enableLike(MatchMode.START).excludeZeroes();
		
		
		DetachedCriteria crit = DetachedCriteria.forClass(Pacjent.class).add(examplePacjent);
		
		return (Pacjent)getHibernateTemplate().findByCriteria(crit).get(0);

		
	}


}
